package com.集合.Collection___.List_.ArrayList_;

import java.util.ArrayList;

@SuppressWarnings("all")
public class ArrayList底层结构和源码 {
    public static void main(String[] args) {
        /**韩顺平510
         * 1.ArrayList中维护的是Object类型的elementDate数组，可以存放任何对象；
         * 即 ： transient Object[] elementData（transient时瞬时的意思，在序列化时被修饰的属性不会被序列化）
         * 2.new ArrayList();当创建ArrayList对象时默认使用无参构造器，初始elementDate数组的容量为0，
         * 第一次添加时则初始化为10个空间，如果满了再次扩容为当前容量的1.5倍； 10-15-22-33等等；
         * 3.new ArrayList(20);如果使用有参构造器指定容量大小为20；如果扩容会在当前基础上扩容1.5倍； 20-30-45-67等等；

         */
        ArrayList list = new ArrayList();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        list.add(100);
    }

    /**1.创建对象，调用无参构造器，初始化list对象为 {}，数组空间为0；
     * this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
     *   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}
     *
     *  2.传入对象
     *  public boolean add(E e) {
     *         modCount++;  //列表在 结构上被修改的次数。结构修改是指更改列表大小的修改 即： 添加和删除共几次了；
     *         add(e, elementData, size); 传对象，数组，元素个数；
     *         return true;
     *     }
     *
     * 3.private void add(E e, Object[] elementData, int s) {
     *         if (s == elementData.length)  //元素个数 == 列表长度  就进去扩容；
     *             elementData = grow(); //扩容
     *         elementData[s] = e;  //添加元素；
     *         size = s + 1;//元素个数+1
     *     }
     *
     * 4. private Object[] grow() {
     *         return grow(size + 1);  //元素个数加1传进去； 即： 加上现在要加的元素与原元素个数总和；
     *     }
     *
     * 5.
     * private Object[] grow(int minCapacity) {
     *         int oldCapacity = elementData.length;  //原数组长度；
     *         if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {  //原数组长度大于0 或 数组不为空；
     *             int newCapacity = ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity, oldCapacity >>1 ); //扩容1.5倍；
     *         return elementData =Arrays.copyOf(elementData,newCapacity); //把原数组扩容后拷贝到新数组在返回给elementData数组；
     *  } else{ //如果不满足条件，新创建一个空数组给elementData
     *   return elementData =new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
     *     }
     *
        }
     */
}

